<?php
/**
 * コントローラクラス定義ファイル
 *
 */

/**
 * コントローラクラス
 *
 */
class Controller {
	/**
	 * 設定情報オブジェクト
	 *
	 * @var SimpleXMLElement
	 */
	protected $setting = null;

	/**
	 * セッションオブジェクト
	 *
	 * @var Session
	 */
	protected $session = null;

	/**
	 * リクエストオブジェクト
	 *
	 * @var Request
	 */
	protected $request = null;

	/**
	 * レスポンスオブジェクト
	 *
	 * @var Response
	 */
	protected $response = null;

	/**
	 * バリューオブジェクト
	 *
	 * @var SimpleXMLElement
	 */
	protected $VO = null;

	/**
	 * アプリケーションプロセス
	 *
	 * @var AppProcess
	 */
	protected $process = null;

	/**
	 * コンストラクタ
	 *
	 * @param SimpleXMLElement $stg 設定情報オブジェクト
	 * @param Session $sess		セッションクラス
	 * @param Request $req		リクエストクラス
	 * @param Response $res		レスポンスクラス
	 */
	function __construct($stg, $sess, $req, $res) {
		$this->setting = $stg;
		$this->session = $sess;
		$this->request = $req;
		$this->response = $res;
		$this->VO = simplexml_load_string('<?xml version="1.0" encoding="utf-8" ?><valueobject />','VSimpleXMLElement');
		$this->process = null;
	}

	/**
	 * 実行部
	 *
	 * Visionから呼び出される
	 *
	 */
	public function execute() {
		// リクエストクラスが必要とするVO->requestを作成
		$this->VO->addChild('request');
		// リクエストクラスが全入力データをXMLツリーに変換
		$this->request->catchAll($this->VO->request);

		// 標準のプロセス名とアクション名を設定
		$procName = "appProcDefault";
		$procAct = "noAction";
		// プロセス名が指定されていれば再定義
		if (strlen($this->request->proc) > 0) {
			$procName = "appProc".escapeshellcmd($this->request->proc);
		}
		// アクション名が指定されていれば再定義
		if (strlen($this->request->act) > 0) {
			$procAct = $this->request->act;
		}
		try {
			// クラスの存在を確認
			class_exists($procName);
			// 指定プロセス名をインスタンス化
			$this->process = new $procName($this->setting, $this->session, $this->request, $this->response, $this->VO, $procAct);
		} catch (Exception $e) {
			// クラスが存在しない場合はappProcUnknownをインスタンス化する
			$this->process = new appProcUnknown($this->setting, $this->session, $this->request, $this->response, $this->VO, $procAct);
		}
		// プロセスを実行し、戻り値からテンプレートをレスポンスクラスへ設定
		$templateFile = (string) $this->process->execute();
		if ($this->request->xmlMode == 'true') {
			$templateFile .= '.xml';
		}
		$this->response->setTemplate($templateFile);

		// デバッグオプションを調べる
		if ($this->setting->debug['enable'] == 'true') {
			$debugSetting = $this->setting->debug->valueobject;
			// PEAR::Var_Dumpを利用するかどうか
			if ($debugSetting->vardump) {
				$pearVarDump = Var_Dump::factory(array('display_mode' => (string) $debugSetting->vardump));
				$this->response->assign('DBG_VISION_VO', $pearVarDump->toString($this->VO));
			}
			// ログファイル出力が指示されているかどうか
			if ($debugSetting->logfile) {
				$this->VO->asXML(DEBUG_LOG_PATH.(string) $debugSetting->logfile);
			}
		}

		// Responseクラスがビュー出力を行う
		$this->response->output();
	}
}

class VSimpleXMLElement extends SimpleXMLElement {
	public function toInteger() {
		return (integer) $this;
	}
}